/*
 * Pez.cpp
 *
 *  Created on: 04/10/2013
 *      Author: ezequiel
 */

#include "Pez.h"
#define MAX_ALETA 28
#define MIN_ALETA 24
#define VELOCIDAD_ALETA 0.25
Pez::Pez(glm::vec3 posicionInicial, glm::vec3 tamanoInicial, glm::vec3 rotacionInicial, float anguloinicial) : Dibujable(){
this->cuerpo = new Cuerpo();
this->posicionPez = posicionInicial;
this->tamanoPez = tamanoInicial;
this->direccionPez	= rotacionInicial;
this->anguloPez = -35;
this->aleta1 = new Aleta();
this->aleta2 = new Aleta();
this->aleta3 = new Aleta();
this->aleta4 = new Aleta();
anguloAleta[0] = 35;
anguloAleta[1] = 35;
this->ojo1 = new OjosPez();
this->ojo2 = new OjosPez();
this->aletaEntra[0] = true;
this->aletaEntra[1] = true;
this->curva = new Circunferencia(20, 0, 0, 16.3);
this->curva->setOrientacionSentidoReloj(true);
this->anguloRespectoCentro = 0;
direccion = 1;
velocidad = 1;
}

Pez::~Pez() {
//delete this->aleta1 ;
//delete this->aleta2;
//delete this->aleta3;
//delete this->cuerpo;
//delete this->curva;
//delete this->ojo1;
//delete this->ojo2;
}

void Pez::render(GLuint handle, glm::mat4* matModelo) {
	//////// dibujo el cuerpo ///////
//	changeObjectColor(handle, 1.0, 1.0, 4.0f);
	glm::mat4 matrizCuerpo = *matModelo;
	matrizCuerpo = glm::translate(matrizCuerpo, glm::vec3(0.0, -1.0, 0.0) );
	matrizCuerpo = glm::scale(matrizCuerpo, glm::vec3(0.5,0.5,0.75));
	matrizCuerpo = glm::rotate(matrizCuerpo, 90.0f, glm::vec3(0.0, 0.0, 1.0) );
	this->cuerpo->render(this->handle, &matrizCuerpo);


//	changeObjectColor(this->handle, 0.0, 2.0, 2.0f);
	glm::mat4 matrizAleta ;
	///////// dibujo las aletas //////
			///aleta izquierda///
	matrizAleta = *matModelo ;
	matrizAleta = glm::translate(matrizAleta, glm::vec3(-3.5, -0.7, 0.0) );
	matrizAleta = glm::rotate(matrizAleta, 90.0f, glm::vec3(0.0, 1.0 , 0) );	//90 grados es constante
	matrizAleta = glm::rotate(matrizAleta, anguloAleta[0], glm::vec3(-1.0, 0, 0) );
	matrizAleta = glm::scale(matrizAleta, glm::vec3(3.5,3.5,2.5));
	this->aleta1->render(this->handle, &matrizAleta);

	///aleta derecha ///
	matrizAleta = *matModelo ;
	matrizAleta = glm::translate(matrizAleta, glm::vec3(-3.5, 0.7, 0.0) );
	matrizAleta = glm::rotate(matrizAleta, 90.0f, glm::vec3(0.0, 1.0 , 0) );	//90 grados es constante
	matrizAleta = glm::rotate(matrizAleta, anguloAleta[1], glm::vec3(1.0, 0, 0) );
	matrizAleta = glm::scale(matrizAleta, glm::vec3(3.5,3.5,2.5));
	this->aleta2->render(this->handle, &matrizAleta);

	///aleta trasera ///

	matrizAleta = *matModelo ;
	matrizAleta = glm::translate(matrizAleta, glm::vec3(-1.9, 0.0, 0.0) );
	matrizAleta = glm::rotate(matrizAleta, 90.0f, glm::vec3(0.0, 1.0 , 0) );
	matrizAleta = glm::scale(matrizAleta, glm::vec3(2.7,2.7,2.9));
	this->aleta3->render(this->handle, &matrizAleta);


	/// aleta superior ///

	matrizAleta = *matModelo ;
	matrizAleta = glm::translate(matrizAleta, glm::vec3(-5.0, 0.0, 1.25) );
	matrizAleta = glm::rotate(matrizAleta, 90.0f, glm::vec3(0.0, 1.0 , 0) );
	matrizAleta = glm::scale(matrizAleta, glm::vec3(2.7,2.7,2.9));
	this->aleta3->render(this->handle, &matrizAleta);

	/////////////// ojos /////////////////
	glm::mat4 matrizOjo ;
//	changeObjectColor(this->handle, 255.0, 255.0, 255.0);
	//// ojo 1 ///

	matrizOjo = *matModelo ;
	matrizOjo = glm::translate(matrizOjo, glm::vec3(-2.65f, 0.20f, 0.6f));
	this->ojo1->render(this->handlerOjos, &matrizOjo);

	//// ojo 1 ///

	matrizOjo = *matModelo ;
	matrizOjo = glm::translate(matrizOjo, glm::vec3(-2.65f, -0.30f, 0.6f));
	this->ojo2->render(this->handlerOjos, &matrizOjo);


//	changeObjectColor(this->handle, 0.0, 0.0, 0.0f);	//color de la grilla

}

void Pez::render(GLuint handle) {
	changeObjectColor(this->handle, 1.0, 1.0,1.0);
	glm::mat4 matrizPez = glm::mat4 (1.0f);
	matrizPez = glm::rotate((matrizPez), this->anguloRespectoCentro, glm::vec3(0.0, 0.0, -1.0));
	matrizPez = glm::translate(matrizPez, this->posicionPez );
	matrizPez = glm::rotate(matrizPez, this->anguloPez,this->direccionPez);
	matrizPez = glm::scale(matrizPez, this->tamanoPez);
	this->render(handle, &matrizPez);
}

void Pez::moverAletas() {
	if (this->aletaEntra[0]) this->anguloAleta[0] = this->anguloAleta[0]- VELOCIDAD_ALETA;
	else this->anguloAleta[0] = this->anguloAleta[0] + VELOCIDAD_ALETA;
	if (this->anguloAleta[0] == MAX_ALETA) this->aletaEntra[0]= true;
	if (this->anguloAleta[0] == MIN_ALETA) this->aletaEntra[0]= false;

	if (this->aletaEntra[1]) this->anguloAleta[1] = this->anguloAleta[1]- VELOCIDAD_ALETA;
	else this->anguloAleta[1] = this->anguloAleta[1] + VELOCIDAD_ALETA;
	if (this->anguloAleta[1] == MAX_ALETA) this->aletaEntra[1]= true;
	if (this->anguloAleta[1] == MIN_ALETA) this->aletaEntra[1]= false;

	if (this->aletaEntra[2]) this->anguloAleta[2] = this->anguloAleta[2]- VELOCIDAD_ALETA;
	else this->anguloAleta[2] = this->anguloAleta[2] + VELOCIDAD_ALETA;;
	if (this->anguloAleta[2] == MAX_ALETA) this->aletaEntra[2]= true;
	if (this->anguloAleta[2] == MIN_ALETA) this->aletaEntra[2]= false;
}

void Pez::moverPez() {
	this->moverAletas();
//	this->curva->calcularPosicion(&this->posicionPez.x, &this->posicionPez.y);
//	this->curva->calcularAngulo(&this->anguloPez);
	this->anguloRespectoCentro = this->anguloRespectoCentro + this->direccion * this->velocidad;
//	this->anguloPez += 0.005;
//	if (anguloRespectoCentro == 360) cout << this->anguloPez << endl;
//	if (this->anguloPez <= -86.3992) this->anguloPez = -90 ;
	if( this->anguloRespectoCentro == 360 ) anguloRespectoCentro = 0 ;
//	std::cout << this->anguloPez << std::endl;
}

void Pez::setearDireccion() {
	this->direccion = this->direccion * (-1);
}

void Pez::setearVelocidad(float velocidad) {
	this->velocidad = velocidad;
}

void Pez::changeObjectColor(GLuint handle, float r, float g, float b)
 {
     glm::vec3 diffuse_reflectivity = glm::vec3( r, g, b );

     GLuint location_diffuse_reflectivity = glGetUniformLocation( handle, "Kd");
     if( location_diffuse_reflectivity >= 0 )
 	{
 		glUniform3fv( location_diffuse_reflectivity, 1, &diffuse_reflectivity[0]);
 	}
}

void Pez::setTextureid(GLuint textureid,  GLuint textureIdAleta,GLuint tNormal, GLuint aNormal, GLuint aRef) {
	this->cuerpo->setTextureid(textureid, tNormal, aRef);
	this->aleta1->setTextureid(textureid,aNormal, aRef );
	this->aleta2->setTextureid(textureid, aNormal, aRef);
	this->aleta3->setTextureid(textureid, aNormal, aRef);
}

void Pez::setCam(Camara* cam, glm::mat4 pr) {
	this->cuerpo->setCam(cam,pr);
	this->aleta1->setCam(cam,pr);
	this->aleta2->setCam(cam,pr);
	this->aleta3->setCam(cam,pr);
	this->ojo1->setCam(cam, pr);
	this->ojo2->setCam(cam, pr);
}

void Pez::setHandlerOjos(int handler) {
	this->handlerOjos = handler ;
}
